#include "List.h"
// 顺序表的创建：    创建一个 班级 将len 等于 0
Sql_list *Init_Sql_List(void)
{
    Sql_list *L = (Sql_list *)malloc(sizeof(Sql_list));
    if (NULL == L)
    {
        printf("内存分配失败\n");
        return NULL;
    }
    L->len = 0;
    L->User_len = 0;
    return L;
}
// 顺序表的插入：
void tail_insert_tail(Sql_list *L, Elenemt_data data)
{
    // 安全判断
    if (NULL == L)
    {
        printf("表 NULL\n");
        return;
    }
    if (MAX_SIZ <= L->len)
    {
        printf("表内数据 为满L\n");
        return;
    }

    // 第一步 数据的写入
    L->data[L->len] = data;
    // 第二步 对表长进行修改
    L->len++;
}
// 用户表的插入：
void tail_insert_User(Sql_list *L, Elenemt_User data)
{
    // 安全判断
    if (NULL == L)
    {
        printf("表 NULL\n");
        return;
    }
    if (MAX_SIZ <= L->User_len)
    {
        printf("表内数据 为满L\n");
        return;
    }

    // 第一步 数据的写入
    L->User[L->User_len] = data;
    // 第二步 对表长进行修改
    L->User_len++;
}
// 顺序表的尾插终端输入：
void cmdtail_insert_tail(Sql_list *L)
{
    Elenemt_data temp_data;
    printf("请输入名字:");
    scanf("%s", temp_data.name);
    printf("请输入性别:");
    scanf("%s", temp_data.sex);
    printf("请输入学号:");
    scanf("%d", &temp_data.id);
    printf("请输入年龄:");
    scanf("%d", &temp_data.age);
    printf("请输入成绩:");
    scanf("%d", &temp_data.sco);
    // 安全判断
    if (NULL == L)
    {
        printf("表 NULL\n");
        return;
    }
    if (MAX_SIZ <= L->len)
    {
        printf("表内数据 为满L\n");
        return;
    }

    // 第一步 数据的写入
    L->data[L->len] = temp_data;
    // 第二步 对表长进行修改
    L->len++;
}
// 顺序表的删除：
void tail_del_list(Sql_list *L)
{
    // 安全判断
    if (NULL == L)
    {
        printf("表 NULL\n");
        return;
    }
    if (0 >= L->len)
    {
        printf("表内数据 为空L\n");
        return;
    }
    // 第一步 修改L->len 减一
    L->len--;
}
// 顺序表的查找：
int find_by_name(Sql_list *L)
{
    char name[20];
    puts("请输入名字:");
    scanf("%s", name);
    for (size_t i = 0; i < L->len; i++)
    {
        if (!strcmp(name, L->data[i].name))
        {
            printf("查找成功\n");
            printf("|%ld\t|名字:%s\t|性别:%s\t|学号:%d|年龄:%d\t|成绩:%d\t|\n", i + 1, L->data[i].name, L->data[i].sex, L->data[i].id,
                   L->data[i].age, L->data[i].sco);
            return i + 1;
        }
    }
}
// 顺序表的按名字删除：
void Del_by_name(Sql_list *L, char *name)
{
    if (0 >= L->len)
    {
        printf("表内数据 为空L\n");
        return;
    }
    for (size_t i = 0; i < L->len; i++)
    {
        if (!strcmp(name, L->data[i].name))
        {
            printf("删除成功!删除的是: %s\n", L->data[i].name);
            for (size_t j = i; j < L->len - 1; j++)
            {
                L->data[j] = L->data[j + 1];
            }
            L->len--;
            return;
        }
    }
}
// 通过名字修改成绩：
void Modify_by_name(Sql_list *L)
{
    if (0 >= L->len)
    {
        printf("表内数据 为空L\n");
        return;
    }
    char name[20];
    int sco;
    puts("请输入名字:");
    scanf("%s", name);
    puts("请输入成绩:");
    scanf("%d", &sco);
    for (size_t i = 0; i < L->len; i++)
    {
        if (!strcmp(name, L->data[i].name))
        {
            L->data[i].sco = sco;
        }
    }
}
// 顺序表的遍历：
void printf_Sql_List(Sql_list *L)
{
    printf("|序号\t|名字\t\t|性别\t\t|学号\t\t|年龄\t\t|成绩\t\t|\n");
    // 数据
    for (size_t i = 0; i < L->len; i++)
    {
        printf("|%ld\t|名字:%s\t|性别:%s\t|学号:%d\t\t|年龄:%d\t|成绩:%d\t|\n", i + 1, L->data[i].name, L->data[i].sex, L->data[i].id,
               L->data[i].age, L->data[i].sco);
    }
}
// 顺序表的判空：
int IsEmpty_Sql_List(Sql_list *L)
{
    if (0 == L->len) // 判断表是否为空
    {
        return 0; // 为空则返回0
    }
    return 1;
}
// 顺序表的清空：
void Clear_Sql_List(Sql_list *L)
{
    L->len = 0;
}

void print_memory(Sql_list *L, size_t size)
{
    unsigned char *byte_ptr = (unsigned char *)L;
    for (size_t i = 0; i < size; i++)
    {
        printf("%02x ", byte_ptr[i]);
        if ((i + 1) % 16 == 0)
        {
            printf("\n");
        }
    }
    printf("\n");
}

// 顺序表的销毁：
void Destroy_Sql_List(Sql_list **L)
{
    free(*L);
    *L = NULL;
}